unit clases;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, StrUtils;

type
  TArrayInteger = Array of Integer;
  TArrayString = Array of String;
  TArrayBoolean = Array of Boolean;
  // Clase de informacion del contenedor
  TContenedor = class
    private
      Function ParsePista(c : String): Integer;
      Function ParseTexto(t : String): String;
      Function ParseNumero(n : String): Integer;
      Function ParseBooleana(b : String): Boolean;
    public
      // Las pistas que contenga el MKV
      Pista : TArrayInteger;
      Tipo : TArrayString;
      Predeterminado : TArrayBoolean;
      Codec : TArrayString;
      Frecuencia : TArrayInteger;
      Lenguaje : TArrayString;
      Canales : TArrayInteger;
      Alto : TArrayInteger;
      Ancho : TArrayInteger;

      TotalPistas : Integer;

      // Obtener las informaciones de las pistas
      Procedure DesglozarPistas(Lista, ListaPistas : TStringList; NumeroPistas : Integer);
      Procedure VaciarArrays();
  end;

implementation

Procedure TContenedor.VaciarArrays();
Begin
  SetLength(Pista,0);
  SetLength(Tipo,0);
  SetLength(Predeterminado,0);
  SetLength(Codec,0);
  SetLength(Frecuencia,0);
  SetLength(Canales,0);
  SetLength(Alto,0);
  SetLength(Ancho,0);
end;

Function TContenedor.ParsePista(c : String): Integer;
Var
  PosUno, PosDos : Integer;
  Temporal : String;
Begin
  PosUno := Pos('ct:',c) + 3;
  PosDos := Pos(')',c);
  Temporal := Copy(c, PosUno, PosDos-PosUno);

     Result := StrToInt(Temporal);
end;

Function TContenedor.ParseTexto(t : String): String;
Begin
   Result := RightStr(t, (Length(t) - Pos(':',t)-1));
end;

Function TContenedor.ParseNumero(n : String): Integer;
Begin
  Result := StrToInt(Trim(RightStr(n, (Length(n) - Pos(':',n)))));
end;

Function TContenedor.ParseBooleana(b : String): Boolean;
Begin
     If (StrToInt(Trim(RightStr(b, 1)))) = 0 Then
      Result := False
     Else
      Result := True;
end;

Procedure TContenedor.DesglozarPistas(Lista, ListaPistas : TStringList; NumeroPistas : Integer);
Var
  i, j : Integer;
Begin
  // Fijamos el total de pistas
  TotalPistas := NumeroPistas;

  // Fijamos los anchos de los arrays
  SetLength(Pista, TotalPistas);
  SetLength(Tipo, TotalPistas);
  SetLength(Predeterminado, TotalPistas);
  SetLength(Codec, TotalPistas);
  SetLength(Frecuencia, TotalPistas);
  SetLength(Lenguaje, TotalPistas);
  SetLength(Canales, TotalPistas);
  SetLength(Alto, TotalPistas);
  SetLength(Ancho, TotalPistas);

  For i := 0 To TotalPistas - 1 Do Begin
    // Valores predeterminados por si no se encuentran en la pista
    Pista[i] := -1;
    Tipo[i] := 'n/a';
    Predeterminado[i] := False;
    Codec[i] := 'n/a';
    Frecuencia[i] := -1;
    Canales[i] := -1;
    Lenguaje[i] := 'n/a';
    Alto[i] := -1;
    Ancho[i] := -1;

     If (i < TotalPistas - 1) Then Begin
        For j := StrToInt(ListaPistas[i]) To (StrToInt(ListaPistas[i+1])-1) Do Begin
          If AnsiContainsText(Lista[j], '|  + Track number:') Then Pista[i] := ParsePista(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Track type:') Then Tipo[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Default flag:') Then Predeterminado[i] := ParseBooleana(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Codec ID:') Then Codec[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Sampling frequency:') Then Frecuencia[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Channels:') Then Canales[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Language:') Then Lenguaje[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Pixel height:') Then Alto[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Pixel width:') Then Ancho[i] := ParseNumero(Lista[j]);
        end;
     end
     Else
     Begin
        For j := StrToInt(ListaPistas[i]) To (Lista.Count-1) Do Begin
          If AnsiContainsText(Lista[j], '|  + Track number:') Then Pista[i] := ParsePista(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Track type:') Then Tipo[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Default flag:') Then Predeterminado[i] := ParseBooleana(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Codec ID:') Then Codec[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Sampling frequency:') Then Frecuencia[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Channels:') Then Canales[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|  + Language:') Then Lenguaje[i] := ParseTexto(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Pixel height:') Then Alto[i] := ParseNumero(Lista[j]);
          If AnsiContainsText(Lista[j], '|   + Pixel width:') Then Ancho[i] := ParseNumero(Lista[j]);
        end;
     end;
  end;



end;

end.

